home *** CD-ROM | disk | FTP | other *** search
- MODULE Spawn;
- __IMP_SWITCHES__
- #ifdef HM2
- #ifdef __LONG_WHOLE__
- (*$!i+: Modul muss mit $i- uebersetzt werden! *)
- (*$!w+: Modul muss mit $w- uebersetzt werden! *)
- #else
- (*$!i-: Modul muss mit $i+ uebersetzt werden! *)
- (*$!w-: Modul muss mit $w+ uebersetzt werden! *)
- #endif
- #endif
- (* Test und Anwendungsbeispiel fuer Modul 'proc'
- *
- * Das Programm 'SHOWCMD.TTP' muss sich in einem Verzeichnis befinden,
- * das in der Environmentvariablen PATH steht.
- *
- * hk, 20-Aug-93
- *)
-
- VAL_INTRINSIC
- CAST_IMPORT
-
- FROM SYSTEM IMPORT
- (* PROC *) ADR;
-
- FROM PORTAB IMPORT
- (* CONST*) NULL,
- (* TYPE *) UNSIGNEDWORD;
-
- FROM types IMPORT
- (* TYPE *) StrRange, StrPtr, StrArray;
-
- IMPORT e;
-
- FROM proc IMPORT
- (* TYPE *) WaitVal, SpawnMode,
- (* PROC *) getpid, getppid, WEXITSTATUS, WIFSIGNALED, WTERMSIG, spawnvp;
-
- FROM cstr IMPORT
- (* PROC *) strerror;
-
- FROM InOut IMPORT
- (* PROC *) Read, Write, WriteInt, WriteCard, WriteString, WriteLn;
-
- (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
-
- CONST
- MaxArgv = 15;
-
- TYPE
- String = ARRAY [0..10] OF CHAR;
-
- VAR
- ret : INTEGER;
- pid : INTEGER;
- ch : CHAR;
- state : WaitVal;
- errstr : ARRAY [0..40] OF CHAR;
-
- idx : StrRange;
- prg : String;
- null : String;
- space : String;
- arg2 : String;
- arg3 : String;
- arg13 : String;
- argv : ARRAY [0..MaxArgv] OF StrPtr;
-
-
- BEGIN
- WriteString("PARENT(pid = "); WriteInt(INT(getpid()), 0);
- WriteString(")"); WriteLn;
-
- prg := "showcmd";
- null := "";
- space := " ";
- arg2 := "-2-";
- arg3 := "-3-";
- arg13 := "-13-";
-
- argv[0] := CAST(StrPtr,ADR(prg));
- FOR idx := 1 TO MaxArgv DO
- argv[idx] := CAST(StrPtr,ADR(null));
- END;
- argv[2] := CAST(StrPtr,ADR(arg2));
- argv[3] := CAST(StrPtr,ADR(arg3));
- argv[4] := CAST(StrPtr,ADR(space));
- argv[13] := CAST(StrPtr,ADR(arg13));
- argv[MaxArgv] := NULL;
-
- e.errno := 0;
- ret := spawnvp(pWAIT, prg, CAST(StrArray,ADR(argv)));
-
- WriteLn;
- WriteString("PARENT(pid = "); WriteInt(INT(getpid()), 0);
- IF e.errno < 0 THEN
- WriteString("): error: ");
- strerror(e.errno, errstr);
- WriteString(errstr);
- WriteLn;
- ELSE
- WriteString("): child-returncode = "); WriteInt(ret, 0); WriteLn;
-
- state := CAST(WaitVal,VAL(UNSIGNEDWORD,ret));
- IF WIFSIGNALED(state) THEN
- WriteString("Terminated by Signal: "); WriteCard(WTERMSIG(state), 0);
- ELSE
- (* "WIFSTOPPED()" braucht nicht abgefragt zu werden, da "wait()"
- * keine gestopten Unterprozesse beruecksichtigt.
- *)
- WriteString("Child exit status: "); WriteInt(WEXITSTATUS(state), 0);
- END;
- END;
- WriteLn;
- Read(ch);
- END Spawn.
-
-
-